/* PassingVariable.java Created on 30/mag/2012 */
package it.tommasocortonesi.scjp.cap4;

/**
 * Classe test per il passaggio dei parametri (pag 213).
 *
 * @author 		tommasocortonesi
 * @version 	1.0, 30/mag/2012
 */
public class PassingVariable {
	
	public static void main(String[] args) {
		PassingVariable pv = new PassingVariable();
		int i = 0;
		Foo f = new Foo();
		
		System.out.println("Before the call to the method: " + i);
		pv.method1(i);
		System.out.println("After the call to the method: " + i);
		System.out.println();
		
		System.out.println("Before the call to the method: " + f.property);
		pv.method2(f);
		System.out.println("After the call to the method: " + f.property);
		System.out.println();
		
		System.out.println("Before the call to the method: " + f.property);
		pv.method3(f);
		System.out.println("After the call to the method: " + f.property);
		
		// Java passa le variabili per VALORE
		// sia che si passi var primitive che riferimento,
		// passiamo sempre una copia dei bit della variabile!
		// NB: il metodo chiamato NON può cambiare la variabile 
		// del metodo chiamante! Per var riferimento, si può cambiare 
		// l'oggetto.
		
	}
	
	public void method1(int i) { 								// passaggio variabile primitiva:
		System.out.println("Inside the method: " + ++i);		// passiamo una copia dei bit 
	}															// che rappresentano il valore
	
	public void method2(Foo f) { 								// passaggio variabile riferimento:
		++f.property;											// possiamo cambiare lo stato
		System.out.println("Inside the method: " + f.property);	// dell'oggetto sottostante
	}
	
	public void method3(Foo f) {								// ma non possiamo cambiare la varibile!
		f = null;												// cambiamo solamente la var copia del metodo
		System.out.println("Inside the method: " + f);			// chiamato!
		// f = new Foo(); ++f.property;
	}

}

class Foo {
	int property = 0;
}
